package com.shujia

import scala.collection.mutable

object Demo14Map {
  def main(args: Array[String]): Unit = {
    /**
     * Map：映射、KV键值对
     * 特点：
     * 1、不可变
     * 2、Map中的每个元素都是KV形式
     * 3、Map中的Key是不会重复的
     * 4、无序的
     * 适用于需要查询的场景
     */

    val map: Map[String, Int] = Map[String, Int](("k1", 1), ("k2", 2), ("k3", 3), "k4" -> 4)

    //    map.toList.sortWith()

    // 过滤value大于2的KV键值对
    map.filter(kv => {
      val key: String = kv._1
      val value: Int = kv._2
      value > 2
    }).foreach(println)

    // 通过Key获取Value
    println(map.getOrElse("k1", -1))
    println(map.getOrElse("kk1", -1))

    /**
     * get方法会返回一个Option类型的对象
     *
     * Option类型就两个子类：Some、None
     * 有值的情况下就将值包装成Some对象进行返回
     * 无值的情况就返回None
     *
     * 一般用于处理模棱两可的情况，有可能有值，也有可能没值
     * 所以就返回一个Option类型引起开发者注意
     * 否则就容易引起空指针异常的问题
     */
    println(map.get("k1"))
    println(map.get("kk1"))

    val maybeInt: Option[Int] = map.get("kk1")

    // 结合Scala中模式匹配match进行后续处理
    maybeInt match {
      case Some(v) =>
        println(v)
      case None =>
        println("Key不存在")
    }

    // 可变的Map
    val mMap: mutable.Map[String, Int] = mutable.Map[String, Int](("k1", 1), Tuple2("k2", 2), "k3" -> 3)
    // 增
    mMap.put("k4", 4)
    mMap.put("k2", 22) // 如果存在即覆盖，相当于修改
    mMap += Tuple2("k5", 5)
    println(mMap)
    // 删
    mMap -= "k2"
    mMap.remove("k1")
    println(mMap)

    // 改
    mMap("k3") = 33
    println(mMap)

  }

}
